package com.group.eams.permission;

import com.group.eams.threadlocal.UserThreadLocal;
import com.group.eams.threadlocal.UserThreadLocalDto;
import com.group.exception.CustomerException;
import com.group.result.ResultEnum;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;
import java.util.List;

/**
 * com.group.eams.permission
 * User: hfs
 * Date: 2024/11/02 15:01
 * Description:
 * Version: V1.0
 */
@Aspect//切面
@Slf4j
public class PermissionAdvice {
    //拦截controller所有方法
    @Around("execution(* com.group.eams.controller.*Controller.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {

        //1.获取目标方法上是否有权限的注解，如果有权限的注解，代表需要进行权限控制


        //2.获取目标方法
        MethodSignature methodSignature= (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();

        //3.获取目标方法上的权限注解
        Permission permission = method.getAnnotation(Permission.class);

        //4.如果目标方法上没有权限注解直接放行
        if(permission==null){
            log.debug("{}：该方法不需要权限控制，直接放行...",method.getName());
            //放行
            return joinPoint.proceed();
        }

        //5.如果是超级管理员直接放行
        if(UserThreadLocal.get().getName().equals("admin")){
            log.debug("超级管理员直接放行...");
            return joinPoint.proceed();
        }
        //6.获取该权限注解的标记
        //tenement:list
        String perms = permission.value();

        List<String> permissionPermsList = UserThreadLocal.get().getPermissionPermsList();

        //7.判断是否有标记的权限
        boolean isOk=false;

        for(String perm:permissionPermsList){
            if(perm.equals(perms)){
                isOk=true;
                break;
            }
        }


        if(!isOk){
            log.error("没有权限:{}",perms);
            throw new CustomerException(ResultEnum.No_PERMISSION);
        }

        //有权限，直接放行
        log.debug("有权限，直接放行...");

        return joinPoint.proceed();
    }

}



